package main

import (
	"fmt"
)

func main() {

	// 1 创建map的三种方式，map和数组不一样不会再创建的时候开辟内存空间，需要make一下才能够使用
	// cap(map01) 会报错，map的大小就是使用len(map01)来判断，当元素数量超过make指定的初始值
	// 的时候，会自动扩容！
	// 1.1 先声明再make  ---------------------
	// map[keyType]valueType
	var map01 map[string]string        // 声明
	map01 = make(map[string]string, 1) // 开辟内存
	map01["a"] = "A01"
	map01["b"] = "B01"
	map01["c"] = "C01"
	// map01["d"] = nil // 和 java 不一样的是 map 的key value都不能为空，即： nil
	fmt.Printf("map01 = %v , map01 type = %T, len(map01) = %v\n", map01, map01, len(map01))
	//map01 = map[a:A01 b:B01] , map01 type = map[string]string, len(amp01) = 2

	//1.2 声明并开辟内存
	map02 := make(map[string]string, 2)
	fmt.Printf("map02 = %v , map02 type = %T, len(map02) = %v\n", map02, map02, len(map02))
	// map02 = map[] , map02 type = map[string]string, len(map02) = 0

	//1.3 创建的时候就给值
	map03 := map[string]string{
		"a": "A01",
		"b": "B01",
		"c": "C01",
	}
	fmt.Printf("map03 = %v , map03 type = %T, len(map03) = %v\n", map03, map03, len(map03))
	// map03 = map[a:A01 b:B01 c:C01] , map03 type = map[string]string, len(map03) = 3

	// 2. map 的增删改  ---------------------
	fmt.Println("map03[\"hello\"] = ", (map03["hello"] == "")) // 不存在 key 的话就是空字符串
	// 	func delete(m map[Type]Type1, key Type)
	// 内建函数delete按照指定的键将元素从映射中删除。若m为nil或无此元素，delete不进行操作。
	delete(map03, "xxx")

	v1, is1 := map03["a"]
	fmt.Println(v1, " -> ", is1) //A01  ->  true
	// 第一个返回值是value，第二个是是否存在

	// 3. 清空 map 的方法 ---------------------
	// 清空map，官方并没有提供清空的方法，我们使用make重新开辟内存再赋值给本省达到清空的效果
	map03 = make(map[string]string, 0)
	fmt.Println("map03 = ", map03) //map03 =  map[]

	//4. 遍历 map ---------------------
	for k, v := range map01 {
		fmt.Printf("map02: k=%v , v=%v\n", k, v)
	}
	// map02: k=a , v=A01
	// map02: k=b , v=B01

	// 5. map配合切片使用
	var mapSlice []map[string]string
	mapSlice = make([]map[string]string, 5, 10) // 开辟空间
	for i := 0; i < 5; i++ {
		k := "k" + fmt.Sprintf("%v", i)
		v := "v" + fmt.Sprintf("%v", i)
		mapi := map[string]string{
			k: v,
		}
		mapSlice[i] = mapi
	}
	fmt.Println("mapSlice = ", mapSlice)
	// mapSlice =  [map[k0:v0] map[k1:v1] map[k2:v2] map[k3:v3] map[k4:v4]]

}
